# 元组内的 元素的引用 不允许修改
# 但我们可以使用很多操作，来产生一个新的元组
tup1 = (1, 1.1); tup2 = ('a', 'abc'); tup3 = tup1 + tup2
print(tup3) # (1, 1.1, 'a', 'abc')

# 不能删除 元组内的元素，但是可以删除整个元组的引用
# del tup3; print(tup3)

print(id(tup3))
tup3 = (1, 2, 3)
print(id(tup3))
'''
2175355795904
2175355736640
'''

# -------------

# 好另类的 创建方式
# 就像函数返回多个值一样，pack/unpack
tup3 = 4, 5, 6
print(tup3, type(tup3)) # (4, 5, 6) <class 'tuple'>
# 就像是这样
int1 = 1; int2 = 2; int2, int1 = int1, int2
print(int1, int2)   # 2 1

# 具名元组
import collections
# namedtuple(typename, field_names, *, rename=False, defaults=None, module=None)
# User = collections.namedtuple('User', ['name', 'sex', 'age']) 
User = collections.namedtuple('User', 'name sex age') # 这也是一样的
user1 = User('william', 'man', 25)
print(user1) # User(name='william', sex='man', age=25)

# 既然是 具名的
user2 = User(name='lianggong', sex='women', age=20)
print(user2)
# User(name='lianggong', sex='women', age=20)

print(user1._fields)
# ('name', 'sex', 'age')

# 通过list创建
user3 = User._make([ 'ij', 'none', 365 ])
print(user3)
# User(name='ij', sex='none', age=365)

# 那么好，直接访问user的属性
print(user3.age)
print(user3._replace(age=0)) # 返回一个新的对象
print(user3)

# 转成字典
print(user3._asdict())